package service

import (
	"context"
	"mini-app/internal/dal"
	"mini-app/internal/dao"
	"mini-app/internal/models"

	"192.168.1.75/go-pkg/errorx"
)

type GoodsClass struct{}

// Add 新增分类
func (GoodsClass) Add(
	ctx context.Context,
	name string,
) error {
	if name == "" {
		return errorx.New("分类名称不能为空", -1)
	}
	if (dao.GoodsClass{}.ExistsByName(ctx, dal.Q, name)) {
		return errorx.New("分类已存在", -1)
	}
	err := dao.GoodsClass{}.Add(ctx, dal.Q, name)
	if err != nil {
		return errorx.New("新增分类失败", -1)
	}
	return nil
}

// Update 更新分类
func (GoodsClass) Update(
	ctx context.Context,
	id string,
	name string,
) error {
	if !(dao.GoodsClass{}).ExistsByID(ctx, dal.Q, id) {
		return errorx.New("分类不存在", -1)
	}
	if (dao.GoodsClass{}.ExistsByName(ctx, dal.Q, name)) {
		return errorx.New("分类已存在", -1)
	}
	if name == "" {
		return errorx.New("分类名称不能为空", -1)
	}
	err := dao.GoodsClass{}.Update(ctx, dal.Q, id, name)
	if err != nil {
		return errorx.New("分类更新失败", -1)
	}
	return nil
}

// Delete 删除分类
func (GoodsClass) Delete(
	ctx context.Context,
	id string,
) error {
	if !(dao.GoodsClass{}).ExistsByID(ctx, dal.Q, id) {
		return errorx.New("分类不存在", -1)
	}
	// 在使用的分类不能被删除
	if (dao.GoodsSetting{}).Exists(ctx, dal.Q, "", "", id) {
		return errorx.New("使用中的分类不能删除", -1)
	}
	// 删除
	err := dao.GoodsClass{}.Delete(ctx, dal.Q, id)
	if err != nil {
		return errorx.New("删除失败", -1)
	}
	return nil
}

// List 分类列表
func (GoodsClass) List(
	ctx context.Context,
) ([]*models.GoodsClass, error) {
	list, _ := dao.GoodsClass{}.List(ctx, dal.Q)
	if len(list) == 0 {
		return []*models.GoodsClass{}, nil
	}
	return list, nil
}
